package ec.edu.ups.cidi.siia.plamdep.ejecutor.GestionAlgoritmos;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import ec.edu.ups.cidi.siia.plamdep.algoritmos.NGramasExtract;
import ec.edu.ups.cidi.siia.plamdep.algoritmos.VectorSpaceModel;
import ec.edu.ups.cidi.siia.plamdep.analizadorLexico.analisis.AnalisisUtils;
import ec.edu.ups.cidi.siia.plamdep.utils.interfaces.AlgoritmoComparacion;
import ec.edu.ups.cidi.siia.plamdep.utils.interfaces.AlgoritmoExtraccion;

public class CargaJAR {
  
    public Object cargarJAR(String ruta, String className)
    {
        try{
          addFile(ruta);
          Class cl=CargaJAR.class.getClassLoader().loadClass(className);//  ClassLoader.getSystemClassLoader().loadClass(className);
          Object o=cl.newInstance();
        return o;
        }catch(Exception e)
        {
        e.printStackTrace();
        return null;
        }
    }
    
    
    private final Class<?>[] parameters = new Class[]{URL.class};

    /**
     * Adds a file to the classpath.
     * @param s a String pointing to the file
     * @throws IOException
     */
    public  void addFile(String s) throws IOException {
        File f = new File(s);
        addURL(f.toURI().toURL());
        
    }

    /**
     * Adds the content pointed by the URL to the classpath.
     * @param u the URL pointing to the content to be added
     * @throws IOException
     */
    public void addURL(URL u) throws IOException {
        URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader();
        Class<?> sysclass = URLClassLoader.class;
        try {
            Method method = sysclass.getDeclaredMethod("addURL",parameters);
            method.setAccessible(true);
            method.invoke(sysloader,new Object[]{ u }); 
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IOException("Error, could not add URL to system classloader");
        }//end try catch        
    }//end method

        
    public AlgoritmoComparacion loadAlgoritmoComparacion(AlgComparacionContainer contenedor )
    {
    	
          //Object obj=this.cargarJAR(contenedor.rutaAlgoritmo,contenedor.className);
    		System.out.println("Cargando algoritmo de comparacion: "+contenedor.nombre);
    	
    		Object obj=new VectorSpaceModel();
        	contenedor.setAlgoritmo((ec.edu.ups.cidi.siia.plamdep.utils.interfaces.AlgoritmoComparacion)obj);

        	GestorAlgoritmos.addAlgoritmoComparacion(contenedor);
           return (AlgoritmoComparacion)obj; 
    }
    public AlgoritmoExtraccion loadAlgoritmoExtraccion(AlgExtractorContainer contenedor )
    {
    	System.out.println("Cargando algoritmo de extracion: "+contenedor.nombre);
           //Object obj=this.cargarJAR(contenedor.rutaAlgoritmo,contenedor.className);
    		Object obj=new NGramasExtract();
           contenedor.setAlgoritmo((AlgoritmoExtraccion)obj);
           GestorAlgoritmos.addAlgoritmoExtraccion(contenedor);
           return (AlgoritmoExtraccion)obj; 
    }
    
}